package com.funny.stock.backtest.service;

import com.funny.stock.backtest.dao.pojo.BackTestPlanDO;
import com.funny.stock.backtest.vo.TradeInfo;
import com.funny.stock.data.collect.HistoryDataService;
import com.funny.stock.data.vo.StockDayData;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.math.BigDecimal;
import java.util.List;

/**
 * @author pengl
 * @date 2020/05/23
 **/
@Component
public class BackTestPlanTaskHelper {
    public static final Logger logger = LoggerFactory.getLogger(BackTestPlanTaskHelper.class);

    @Autowired
    HistoryDataService historyDataService;

    public void startBackTest(BackTestPlanDO planDO){
        List<StockDayData> dataList = historyDataService.getDataByRange(planDO.getStockCode(), planDO.getStartDate(), planDO.getEndDate());
        if(CollectionUtils.isEmpty(dataList)){
            logger.info("stock data is empty");
            return;
        }

        StockDayData beforeData = historyDataService.getDayBeforeData(planDO.getStartDate());
        BigDecimal baseTradePrice;
        if(beforeData == null){
            //若前一天没有交易数据，采用第一天交易数据
            beforeData = dataList.get(0);
            baseTradePrice = beforeData.getOpenPrice();
        }else{
            baseTradePrice = beforeData.getClosePrice();
        }

        BigDecimal initBalance = planDO.getInitBalance();
        BigDecimal initBuyPer = planDO.getInitBuyPer();

        Long tradeStockNum = planDO.getTradeStockNum();
        BigDecimal lockStockNumPer = planDO.getLockStockNum();
        BigDecimal buyTotalPrice = planDO.getBuyTotalPrice();
        BigDecimal increasePer = planDO.getIncreasePer();
        BigDecimal decreasePer = planDO.getDecreasePer();

//        BigDecimal nextSellPrice = baseTradePrice.multiply(increasePer.add(BigDecimal.valueOf(1)));
//        BigDecimal nextBuyPrice = baseTradePrice.multiply(decreasePer.subtract(BigDecimal.valueOf(1)));

        TradeInfo tradePriceInfo = new TradeInfo();
        tradePriceInfo.setIncreasePer(increasePer);
        tradePriceInfo.setDecreasePer(decreasePer);
//        tradePriceInfo.setCurTradePrice(baseTradePrice);

//        tradePriceInfo.calcNextTradePriceInfo(baseTradePrice);
//        计算出来的值：
//        下笔高抛价格
//                nextSellPrice = basePrice * (1 + increasePer)
//
//        下笔低吸价格
//                nextBuyPrice = basePrice * (1 - decreasePer)
//
//        每一次高抛低吸的收益
//                income = 高抛费用 - 低吸费用 - (买入手续费 + 卖出手续费)
//        低吸费用 = nextBuyPrice * tradeStockNum
//        高抛费用 = nextSellPrice * tradeStockNum
//
//
//        深市：
//        买入手续费 = Math.max(5,commissionPer * 低吸费用)
//        卖出手续费 = Math.max(5,commissionPer * 高抛费用) + 0.1% * 高抛费用
//
//        沪市：
//        买入手续费 = Math.max(5,commissionPer * 低吸费用)
//        卖出手续费 = Math.max(5,commissionPer * 高抛费用) + 0.1% * 高抛费用 + Math.max(1,tradeStockNum/1000)


        for (int i = 0; i < dataList.size(); i++) {
            StockDayData stockDayData = dataList.get(i);

        }


//        计算出来的值：
//        套利统计：
//        初始成本价，最终成本价，成本降低百分比
//        套利次数，增加收益，增加收益百分比
//                套利记录
//
//        当前每股成本
//                curCostStockPrice
//
//        买入每股成本
//        buyCostStockPrice = （买入总金额 + 买入手续费） / 买入股票数目
//
//                卖出每股成本
//        sellCostStockPrice = （卖出总金额 - 卖出手续费）/ 卖出股票数目
//
//                低吸买入后
//        curCostStockPrice = (curCostStockPrice + buyCostStockPrice) / 买入后股票总数
//
//        高抛卖出后
//                curCostStockPrice = curCostStockPrice - (sellCostStockPrice - curCostStockPrice)/ 剩余的股票数目
//
//        成本降低百分比
//                (curCostStockPrice - stockCostPrice)/stockCostPrice * 100
//
//        套利次数
//        已经买入卖出次数/2
//
//        增加收益
//                incomeSum = income累加
//
//        增加收益百分比
//        incomeSum/总资产
//
//        持有不进行操作的收益百分比（不计算分红）
//        结束日期收盘价 - buyCostStockPrice / buyCostStockPrice * 100


    }

    private TradeInfo findTradePriceInfo(StockDayData data, TradeInfo tradePriceInfo){
        TradeInfo result = null;
        int buyCompareVal = data.getMaxPrice().compareTo(tradePriceInfo.getNextBuyPrice());
        int sellCompareVal = data.getLowPrice().compareTo(tradePriceInfo.getNextSellPrice());

        if(buyCompareVal == 1){
            BigDecimal nextBuyPrice = tradePriceInfo.getNextBuyPrice();
//            TradeInfo tempTradePriceInfo = tradePriceInfo.calcNextTradePriceInfo(nextBuyPrice);
//            findTradePriceInfo(data,tempTradePriceInfo);
        }

        if(sellCompareVal == -1){

        }

        return null;
    }




}
